ZGlmZiAtLWdpdCBhL2xpYl9pMzg2L3BjaS5jIGIvbGliX2kzODYvcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNkMWQyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYl9pMzg2L3BjaS5jCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBEYW5pZWwgRW5nc3Ry9m0sIE9taWNyb24gQ2V0aSBBQiwgZGFuaWVsQG9taWNyb24uc2UKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+IAorI2luY2x1ZGUgPHBjaS5oPiAKKyNpbmNsdWRlIDxhc20vaW8uaD4gCisjaW5jbHVkZSA8YXNtL3BjaS5oPiAKKworI2lmZGVmIENPTkZJR19QQ0kKKyN1bmRlZiBQQ0lfUk9NX1NDQU5fVkVSQk9TRQorCitpbnQgcGNpX3NoYWRvd19yb20ocGNpX2Rldl90IGRldiwgdW5zaWduZWQgY2hhciAqZGVzdCkgCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOworCWludCByZXMgPSAtMTsKKwlpbnQgaTsKKwkKKwl1MzIgcm9tX2FkZHI7CisJdTMyIGFkZHJfcmVnOworCXUzMiBzaXplOworCQorCXUxNiB2ZW5kb3I7CisJdTE2IGRldmljZTsKKwl1MzIgY2xhc3NfY29kZTsKKworCWhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoUENJX0JVUyhkZXYpKTsKKyNpZiAwCisJcHJpbnRmKCJwY2lfc2hhZG93X3JvbSgpIGFza2VkIHRvIHNoYWRvdyBkZXZpY2UgJXggdG8gJXhcbiIsCisJICAgICAgIGRldiwgKHUzMilkZXN0KTsKKyNlbmRpZgkKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9WRU5ET1JfSUQsICZ2ZW5kb3IpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0RFVklDRV9JRCwgJmRldmljZSk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmY2xhc3NfY29kZSk7CisJCisgCWNsYXNzX2NvZGUgJj0gMHhmZmZmZmYwMDsKKwljbGFzc19jb2RlID4+PSA4OworCisjaWYgMAkKKwlwcmludGYoIlBDSSBIZWFkZXIgVmVuZG9yICUwNHggZGV2aWNlICUwNHggY2xhc3MgJTA2eFxuIiwKKwkgICAgICAgdmVuZG9yLCBkZXZpY2UsIGNsYXNzX2NvZGUpOworI2VuZGlmCQorCS8qIEVuYWJsZSB0aGUgcm9tIGFkZGVzcyBkZWNvZGVyICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIFBDSV9ST01fQUREUkVTUywgUENJX1JPTV9BRERSRVNTX01BU0spOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIFBDSV9ST01fQUREUkVTUywgJmFkZHJfcmVnKTsKKworCWlmICghYWRkcl9yZWcpIHsKKwkJLyogcmVnaXN0ZXIgdW5pbXBsZW1lbnRlZCAqLworCQlwcmludGYoInBjaV9jaGFkb3dfcm9tOiBkZXZpY2UgZG8gbm90IHNlZW0gdG8gaGF2ZSBhIHJvbVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJCisJc2l6ZSA9ICh+KGFkZHJfcmVnJlBDSV9ST01fQUREUkVTU19NQVNLKSkrMTsgIAorCQorI2lmIDAJCisJcHJpbnRmKCJST00gaXMgJWQgYnl0ZXNcbiIsIHNpemUpOworI2VuZGlmCQorCXJvbV9hZGRyID0gcGNpX2dldF9yb21fd2luZG93KGhvc2UsIHNpemUpOworI2lmIDAJCisJcHJpbnRmKCJST00gbWFwcGVkIGF0ICV4IFxuIiwgcm9tX2FkZHIpOworI2VuZGlmCQorCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBQQ0lfUk9NX0FERFJFU1MsIAorCQkJICAgICAgIHBjaV9waHlzX3RvX21lbShkZXYsIHJvbV9hZGRyKQorCQkJICAgICAgIHxQQ0lfUk9NX0FERFJFU1NfRU5BQkxFKTsKKworCisJCisJZm9yIChpPXJvbV9hZGRyO2k8cm9tX2FkZHIrc2l6ZTsgaSs9NTEyKSB7CisJCQorCQkKKwkJaWYgKHJlYWR3KGkpID09IDB4YWE1NSkgeworCQkJdTMyIHBjaV9kYXRhOworI2lmZGVmIFBDSV9ST01fU0NBTl9WRVJCT1NFCisJCQlwcmludGYoIlJPTSBzaWduYXR1cmUgZm91bmRcbiIpOworI2VuZGlmCQkJCisJCQlwY2lfZGF0YSA9IHJlYWR3KDB4MTgraSk7CisJCQlwY2lfZGF0YSArPSBpOworCQkJCisJCQlpZiAoMD09bWVtY21wKCh2b2lkKilwY2lfZGF0YSwgIlBDSVIiLCA0KSkgeworI2lmZGVmIFBDSV9ST01fU0NBTl9WRVJCT1NFCQkJCQorCQkJCXByaW50ZigiRm91bnQgUENJIHJvbSBpbWFnZSBhdCBvZmZzZXQgJWRcbiIsIGktcm9tX2FkZHIpOworCQkJCXByaW50ZigiVmVuZG9yICUwNHggZGV2aWNlICUwNHggY2xhc3MgJTA2eFxuIiwKKwkJCQkgICAgICAgcmVhZHcocGNpX2RhdGErNCksIHJlYWR3KHBjaV9kYXRhKzYpLAorCQkJCSAgICAgICByZWFkbChwY2lfZGF0YSsweDBkKSYweGZmZmZmZik7CisJCQkJcHJpbnRmKCIlc1xuIiwgCisJCQkJICAgICAgIChyZWFkdyhwY2lfZGF0YSsweDE1KSAmMHg4MCk/CisJCQkJICAgICAgICJMYXN0IGltYWdlIjoiTW9yZSBpbWFnZXMgZm9sbG93Iik7CisJCQkJc3dpdGNoIAkocmVhZGIocGNpX2RhdGErMHgxNCkpIHsKKwkJCQljYXNlIDA6CisJCQkJCXByaW50ZigiWDg2IGNvZGVcbiIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDE6CisJCQkJCXByaW50ZigiT3BlbmZpcm13YXJlIGNvZGVcbiIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDI6CisJCQkJCXByaW50ZigiUEFSSVNDIGNvZGVcbiIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcHJpbnRmKCJJbWFnZSBzaXplICVkXG4iLCByZWFkdyhwY2lfZGF0YSsweDEwKSAqIDUxMik7CisjZW5kaWYJCQkJCisJCQkJLyogRml4TWU6IEkgdGhpbmsgd2Ugc2hvdWxkIGNvbXBhcmUgdGhlIGNsYXNzIGNvZGUKKwkJCQkgKiBieXRlcyBhcyB3ZWxsIGJ1dCBJIGhhdmUgbm8gcmVmZXJlbmNlIG9uIHRoZQorCQkJCSAqIGV4YWN0IG9yZGVyIG9mIHRoZXNlIGJ5dGVzIGluIHRoZSBQQ0kgUk9NIGhlYWRlciAqLworCQkJCWlmIChyZWFkdyhwY2lfZGF0YSs0KSA9PSB2ZW5kb3IgJiYgCisJCQkJICAgIHJlYWR3KHBjaV9kYXRhKzYpID09IGRldmljZSAmJgorCQkJCSAgICAvKiAocmVhZGwocGNpX2RhdGErMHgwZCkmMHhmZmZmZmYpID09IGNsYXNzX2NvZGUgJiYgKi8KKwkJCQkgICAgcmVhZGIocGNpX2RhdGErMHgxNCkgPT0gMCAvKiB4ODYgY29kZSBpbWFnZSAqLyApIHsKKyNpZmRlZiBQQ0lfUk9NX1NDQU5fVkVSQk9TRQkJCQkJCisJCQkJCXByaW50ZigiU3VpdGFibGUgUk9NIGltYWdlIGZvdW5kLCBjb3B5aW5nXG4iKTsKKyNlbmRpZgkJCQkJCisJCQkJCW1lbW1vdmUoZGVzdCwgKHZvaWQqKXJvbV9hZGRyLCByZWFkdyhwY2lfZGF0YSsweDEwKSAqIDUxMik7CisJCQkJCXJlcyA9IDA7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQl9CisJCQkJaWYgKHJlYWR3KHBjaV9kYXRhKzB4MTUpICYweDgwKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwl9CisJCisjaWZkZWYgUENJX1JPTV9TQ0FOX1ZFUkJPU0UKKwlpZiAocmVzKSB7CisJCXByaW50ZigiTm8gc3VpdGFibGUgaW1hZ2UgZm91bmRcbiIpOworCX0KKyNlbmRpZgkKKwkvKiBkaXNhYmxlIFBBUiByZWdpc3RlciBhbmQgUENJIGRldmljZSBST00gYWRkcmVzcyBkZXZvY2VyICovCisJcGNpX3JlbW92ZV9yb21fd2luZG93KGhvc2UsIHJvbV9hZGRyKTsKKwkgIAkKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX1JPTV9BRERSRVNTLCAwKTsKKworCXJldHVybiByZXM7Cit9CisKKyNlbmRpZgo=